Spring Boot 2.0.0 终于正式发布,重大修订版本
北京时间 2018 年 3 月 1 日早上,如约发布的 Spring Boot 2.0 在同步至 Maven 仓库时出现问题,导致在 GitHub 上发布的 v2.0.0.RELEASE 被撤回。目前问题已修复,官方重新发布了 Spring Boot 2.0,并提供了 Maven 中央仓库地址。
使用 Spring Boot 2.0.0 GA
Maven
Gradle
而 Spring Boot 2.0.1 也被标记为 SNAPSHOT 状态
Maven
Gradle
官方表示,这个版本经历了 17 个月的开发,有 215 个不同的使用者提供了超过 6800 次的提交。非常感谢提供贡献的每一位用户,并感谢所有对这些里程碑版本提供重要反馈的早期采用者。
该版本是自 4 年前发布 Spring Boot 1.0 以来的第一次重大修订,也是首个提供对 Spring Framework 5.0 支持的 GA 稳定版本。
新版本值得关注的亮点:
基于 Java 8,支持 Java 9
支持 Quartz 调度程序
大大简化了安全自动配置
支持嵌入式 Netty
Tomcat, Undertow 和 Jetty 均已支持 HTTP/2
全新的执行器架构,支持 Spring MVC, WebFlux 和 Jersey
使用 Spring WebFlux/WebFlux.fn 提供响应式 Web 编程支持
用于响应式 Spring Data Cassandra, MongoDB, Couchbase 和 Redis 的自动化配置和启动器 POM
引入对 Kotlin 1.2.x 的支持,并提供了一个 runApplication 函数,让你通过惯用的 Kotlin 来运行 Spring Boot 应用程序。更多信息请参阅参考文档中对 Kotlin 的支持部分
启动时的 ASCII 图像 Spring Boot banner 现已支持 GIF
Spring Boot 2 新特性解读
根据我们此前的报道,Spring Boot 2 最大的变化主要集中在以下几方面:
Spring Boot 2 基于 Spring Framework 5,而整个 Spring Framework 5.0 代码库运行于 Java 8 之上。所以,Spring Boot 2 要求的 JDK 版本最低也是 Java 8,同时也已正式支持 Java 9(这里有一份使用 Java 9 运行 Spring Boot 的文档 https://www.oschina.net/translate/spring-boot-with-java9)
与 Spring Boot 1 的差别在于,许多配置属性已被重命名或被删除,因此由 Spring Boot 1 迁移至 Spring Boot 2 需要注意一些配置属性
Spring Boot 为 Java 应用程序引入的关键创新是将 Servlet 容器嵌入到一个可执行的 jar 包中,这个 jar 包会打包整个应用。Spring Boot 还提供了 Tomcat、Undertow 和 Jetty 作为可选的方案
在此前发布的 RC 版本中,Tomcat、Undertow 和 Jetty 均已支持 HTTP/2,并通过 Conscrypt 库提供对原生 TLS 的支持。这对 Spring Boot 的默认服务器 Tomcat 8.5.x 来说意义重大,如果 libtcnative 库及其依赖项安装在主机操作系统上,则只支持 HTTP/2。
监控方面,Spring Boot 2 增强了对 Micrometer 的集成。RabbitMQ、JVM 线程和垃圾收集指标会自动进行 instrument 监控,异步控制器(controller)也会自动添加到监控里。通过集成,还可以对 InfluxDB 服务器进行监控。
数据方面,Spring Boot 2 让你能够以更加细粒度的方式自定义 Hibernate 属性。另外,还可以暴露 RedisCacheConfiguration,从而控制 RedisCacheManager。Flyway 和 Liquibase 配置也更灵活。
此外,Spring Boot 2 也大大增强了对 GSON 的支持,还包含了改进的 actuator JSON 架构。
还有一个值得关注的变更就是 Spring Boot banner —— 即启动时的 ASCII 图像,它被开发团队广泛应用于展示自己的应用品牌信息。在 Spring Boot 2 中,现已支持动画 GIF。
值得注意的是,在 Spring Boot 2.0 中,许多配置属性已被重命名或被删除,为了方便升级,Spring Boot 发布了一个新的 spring-boot-properties-migrator 模块。只要将其作为依赖添加到项目中,它不仅会分析应用程序的环境并在启动时打印诊断信息,而且还会在运行时阶段为项目临时将属性迁移至新的配置方式。
有关 Spring Boot 2.0 更详细的迁移指南,可以保持关注我们正在翻译的官方文档:
https://www.oschina.net/translate/spring-boot-2-0-migration-guide
欢迎有兴趣的开发者一起参与翻译~!
下面我们来看看 Spring Boot 2 值得关注的新特性。
支持 Java 9
Spring Boot 2 最值得期待的新功能莫过于对 Java 9 的正式支持,现在要求最低的 JDK 版本是 Java 8,这意味着不可以使用 JDK 7 或更旧的版本运行 Spring Boot 2。
Spring Framework
Spring Framework 5.0 现已与 Spring Boot 集成。Spring Framework 5.0 一些有趣的功能:
支持 JDK 9 和 Java EE 8 级别的 API(如 Servlet 4.0)
与 Reactor 3.1, JUnit 5, 和 Kotlin 语言的全面集成
带来了许多函数式 API 变体 (functional API variants)
响应式堆栈 Web 框架 —— Spring WebFlux
完全支持 JUnit 5 Jupiter,因此可以在 JUnit 5 中编写测试
添加对 @Nullable 和 @NotNull 注解的支持,以在编译时而不是运行时处理空指针异常
Spring Security
虽然 Spring Security 并非是 Spring Boot 的正式组成部分,但这里仍值得一提,因为它能与 Spring Framework 5.0 很好地搭配使用。最新的 Spring Security 5 提供了超过 400 多项的功能增强和错误修复。有以下值得关注的新功能:
用户可通过 OAuth 2.0 provider 使用现有帐户进行身份验证
与 Spring Framework 5 一样,Spring Security 5 也添加了对响应式编程的支持
以更现代的方式完成对密码的编码
@ConditionalOnBean
从 Spring Boot 1.x 迁移到 2.x 时需要考虑的重要一点是,当确定条件是否满足时,@ConditionalOnBean 注解现在使用逻辑 AND 而不是逻辑 OR 来表示。
对 WebFlux 和 WebFlux.fn 的支持
Spring Boot 2.0 为响应式的 Spring Web 框架提供了一个新的启动器 — spring-boot-starter-webflux,spring-boot-starter-webflux 本身包含 WebFlux,再加上 Reactor Netty 作为默认的 Web 引擎(spring-boot-starter-reactor-netty)。
可以使用 @WebFluxTest 来测试响应式的控制器,它为 Spring MVC 提供了类似于 @WebMvcTest 的支持,而且 WebTestClient 是自动配置的。
最低支持版本的更新
Jetty 9.4
Tomcat 8.5
Hibernate 5.2
Gradle 3.4
Thymeleaf
Spring Boot 2 另一个值得关注的新特性是现已正式支持 Thymeleaf 3,包含了对 Thymeleaf 和 Spring Security Thymeleaf 依赖关系的更新。Thymeleaf 3 中值得关注的变化:
由于使用了新的解析系统,Thymeleaf 不再基于 XML
引入新的文本模板模式,它给 Thymeleaf 提供了输出 CSS,Javascript 和纯文本的功能
重写了引擎,性能显著提升
最后的话
Spring Boot 2 是一个重大版本,以下新增的特性或许是你选择升级的理由:
支持 Java 9
对响应式应用更好的支持
支持 Thymeleaf 3
如果你能从这些变化中受益,不妨考虑选择升级。另外,Spring Boot 2 还包含许多错误修复和性能改进,这些都是升级的重要原因。
更多内容可以查看发布说明:
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes
使用 Java 9 运行 Spring Boot
如果你希望使用 Java 9 运行 Spring Boot 应用程序,这篇文章将会对你有所帮助。
注意:问题跟踪器包含了所有未解决的关于 Java 9 的已知问题,所以在报告新问题前,请查看该列表。
要求
Spring Boot 2.0 是首个支持 Java 9 的版本(同时支持 Java 8)。如果你正在你使用 1.5.0 并希望使用 Java 9,你应该升级到 2.0 版本,官方表示目前没有计划在 Spring Boot 1.5.x 系列上支持 Java 9。
AspectJ
使用 Java 9,如果你需要编译 JDK 中的类,则需要使用 AspectJ 1.9(目前处于 RC 阶段)。这是一个临时的解决方案,因为 Aspect 1.9 GA 即将推出,而且 Spring Boot 也将升级到该版本。在大多数情况下,使用 AspectJ 1.8(Spring Boot snapshot 中的默认版本),Spring AOP 也能正常运行。
JAXB
升级时可能会遇到以下情况:
Hibernate 通常需要的 JAXB 不再默认提供。你需要为你的项目添加以下依赖:
或者你可以添加 java.xml.bind 模块以使用 Java 9 恢复该功能。
Testing
使用 Java 9 进行测试时,最新的 maven-surefire-plugin 版本(2.20.1)引入了回归错误,你可以降级到 2.20.0,或显式添加一个模块以防止引入 java.se.ee:
已知的限制
下面这些库尚未完全支持 Java 9:
Apache Cassandra,详情请查看 #10453
除非以打包的 war 形式运行,否则 JSP TLD 会附带有嵌入式的 Tomcat,详情请查看 #10456